package com.dyna.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.dyna.domain.dto.LoginUser;
import com.dyna.domain.resp.PageResult;
import com.dyna.foundation.domain.bo.UserInfoBo;
import com.dyna.foundation.domain.entity.SysUser;
import com.dyna.foundation.domain.form.SysUserSaveForm;
import com.dyna.foundation.domain.req.SysUserPageReq;
import com.dyna.foundation.domain.resp.SysUserImportExcelResp;
import com.dyna.foundation.domain.resp.SysUserImportResp;

import javax.validation.Valid;
import java.util.List;

/**
* @author Admin
* @description 针对表【user】的数据库操作Service
* @createDate 2023-08-13 20:16:58
*/
public interface SysUserService extends IService<SysUser> {

    /**
     * 查询用户详细信息
     * @param userId 用户userId
     * @return 用户信息
     */
    UserInfoBo getUserById(Long userId);

    /**
     * 查询登录用户信息
     * @param userId
     * @return
     */
    LoginUser getLoginUserById(Long userId);

    /**
     * 批量查询用户
     * @param userIdList 用户ids
     * @return List<User>
     */
    List<UserInfoBo> getUserByIds(List<Long> userIdList);

    /**
     * 用户签到
     * @return 签到结果
     */
    Long sign();

    /**
     * 取消用户签到
     * @return boolean
     */
    Boolean cancelSign();

    /**
     * 根据用户名查询
     * @param username 用户名
     * @return User
     */
    SysUser getUserByUsername(String username);

    /**
     * 根据角色id查询用户
     * @param roleId 角色id
     * @return List<UserInfoBo>
     */
    List<UserInfoBo> getUserByRoleId(Long roleId);

    /**
     * 测试远程调用
     * @param userId 用户id
     * @return Boolean
     */
    Boolean testDel(Long userId);

    /**
     * 创建用户
     *
     * @param createReqVO 用户信息
     * @return 用户编号
     */
    Long createUser(@Valid SysUserSaveForm createReqVO);

    /**
     * 修改用户
     *
     * @param updateReqVO 用户信息
     */
    void updateUser(@Valid SysUserSaveForm updateReqVO);

    /**
     * 删除用户
     *
     * @param id 用户编号
     */
    void deleteUser(Long id);

    /**
     * 修改密码
     *
     * @param userId       用户编号
     * @param password 密码
     */
    void updateUserPassword(Long userId, String password);

    /**
     * 修改状态
     *
     * @param id     用户编号
     * @param status 状态
     */
    void updateUserStatus(Long id, Integer status);

    /**
     * 判断密码是否匹配
     *
     * @param rawPassword 未加密的密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String rawPassword, String encodedPassword);

    /**
     * 获得用户分页列表
     *
     * @param reqVO 分页条件
     * @return 分页列表
     */
    PageResult<SysUser> getUserPage(SysUserPageReq reqVO);

    /**
     * 获得指定状态的用户们
     *
     * @param status 状态
     * @return 用户们
     */
    List<SysUser> getUserListByStatus(Integer status);

    /**
     * 通过用户 ID 查询用户
     *
     * @param userId 用户ID
     * @return 用户对象信息
     */
    SysUser getUser(Long userId);

    /**
     * 批量导入用户
     *
     * @param importUsers     导入用户列表
     * @param isUpdateSupport 是否支持更新
     * @return 导入结果
     */
    SysUserImportResp importUserList(List<SysUserImportExcelResp> importUsers, boolean isUpdateSupport);


}
